package com.lyn.chapter3.demo2;

/**
 * 多线程可用，使用volatile修饰instance，可保证：
 * 1. 可见性：一个线程执行操作3后修改了instance值，其他线程可以读取响应的值
 * 2. 有序性：volatile能禁止volatile变量写操作与该操作之前的任何读、写操作进行重排序。
 * @author mac
 *
 */
public class DCLSingleton {
	private static volatile DCLSingleton instance = null;
	private DCLSingleton() {
		//什么也不做
	}
	 public static DCLSingleton getInstance() {
		 if(null == instance) { //操作1
			 synchronized (DCLSingleton.class) {
				if(null == instance) { //操作2
					instance = new DCLSingleton(); //操作3
				}
			 }
		 }
		 return instance;
	 }
	 
	 public void someService() {
		 //省略其他代码
	 }
}
